#include <unordered_map>
#include <sstream>
#include "tcpsocket.hpp"

int main(int argc, char *argv[])
{
    if (argc < 2) {
        std::cout << "usage: ./tcp_srv 9000\n";
        return -1;
    }
    int port = std::stoi(argv[1]);
    TcpSocket lst_sock;
    //创建套接字
    CHECK_RET(lst_sock.Socket());
    //绑定地址信息, "0.0.0.0"会被识别为本机上任意网卡IP地址--绑定0.0.0.0就表示绑定了本机上所有网卡
    CHECK_RET(lst_sock.Bind("0.0.0.0", port));
    //开始监听
    CHECK_RET(lst_sock.Listen());
    while(1) {
        //获取新建连接,获取了与哪个客户端新建的连接，则与哪个客户端进行通信
        TcpSocket new_sock;
        std::string cli_ip;
        int cli_port;
        CHECK_RET(lst_sock.Accept(&new_sock, &cli_ip, &cli_port));
        std::cout << "new connect: " << cli_ip << ":" << cli_port << "\n";
        //使用新建连接收发数据, 一定要注意，通信使用的是新获取的套接字，而不是监听套接字
        std::string buf;
        new_sock.Recv(&buf);//接收数据
        std::cout << "req:[" << buf << "]\n";
        //作为一个http服务器，应该一行数据一行数据进行接受，当遇到空行的到时候头部到此结束
        //按照http协议格式解析http请求头部
        //根据头部字段中Content-Length字段的值接受指定长度的正文（GET没有正文）
        //根据请求方法，资源路径，....确定客户端的请求是什么然后进行业务处理
        //最终组织http响应数据进行响应

        std::string body = "<html><body><h1>Hello Class 94</h1></body></html>";
        std::stringstream ss;
        ss << "HTTP/1.1 200 Found\r\n";
        ss << "Connection: close\r\n";
        //ss << "Content-Type: application/octet-stream\r\n";
        ss << "Content-Type: text/html\r\n";
        ss << "Content-Length: " << body.size() << "\r\n";
        ss << "Location: https://www.baidu.com\r\n";//只有3xx重定向的时候才生效
        ss << "\r\n";
        ss << body;
        new_sock.Send(ss.str());//to_string将数字转string的接口
        new_sock.Close();
    }
    //关闭套接字
    lst_sock.Close();
    return 0;
}
